home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 40
/
Aminet 40 (2000)(Schatztruhe)[!][Dec 2000].iso
/
Aminet
/
dev
/
src
/
xad_CAB.lha
/
ConvertE.c
< prev
next >
Wrap
C/C++ Source or Header
|
2000-08-05
|
3KB
|
87 lines
#ifndef XADMASTER_CONVERTE_C
#define XADMASTER_CONVERTE_C
/* Programmheader
Name: ConvertE.c
Main: xadmaster
Versionstring: $VER: ConvertE.c 1.2 (04.07.2000)
Author: SDI, Kyzer
Distribution: Public Domain
Description: endian conversion macros
1.0 22.08.1999 : first version
1.1 22.06.2000 : improved version by Kyzer, removed EndSet funcs
1.2 04.07.2000 : more compiler checks, portability fixes
*/
/* macros to use:
* EndGetXXX(a) - reads value of endianness XXX from memory.
* 'a' should be of type 'char *' or 'unsigned char *'
* EndConvXXX(a) - converts expression/value/var of endianness XXX to
* the correct endianness for this architecture.
*
* XXX can be:
* M32 - big-endian Motorola format, 32 bit value
* M16 - big-endian Motorola format, 16 bit value
* I32 - little-endian Intel format, 32 bit value
* I16 - little-endian Intel format, 16 bit value
*
* Note that the EndConvXXX macros only work for architectures that are
* themselves little- or big-endian, and only work if the defines tested
* below reveal the correct endianness of the architecture being compiled for.
* Define either XAD_BIGENDIAN or XAD_LITTLEENDIAN.
*
* It is recommended that you only use the EndGetXXX() macros, as these are
* endian-neutral, and even work on middle-endian machines like PDPs or
* switchable-endian machines like PPCs.
*
* Keep in mind, that the macros require calculation time, so avoid to use
* them double time. Call them once and reuse results.
*/
#define EndGetM32(a) ((((a)[0])<<24)|(((a)[1])<<16)|(((a)[2])<<8)|((a)[3]))
#define EndGetM16(a) ((((a)[0])<<8)|((a)[1]))
#define EndGetI32(a) ((((a)[3])<<24)|(((a)[2])<<16)|(((a)[1])<<8)|((a)[0]))
#define EndGetI16(a) ((((a)[1])<<8)|((a)[0]))
/* private */
#define _xecswap16(a) ((((a) & 0x00FF) << 8) | (((a) >> 8) & 0x00FF))
#define _xecswap32(a) ((((a) & 0x00FF) << 24) | (((a) & 0xFF00) << 8) | \
(((a) >> 8) & 0xFF00) | (((a) >> 24) & 0x00FF))
/* some future music */
#define _xecswap64(a) (_xecswap32((a) >> 32) | (_xecswap32(a) << 32))
/* if XAD_BIGENDIAN or XAD_LITTLEENDIAN is defined, use that instead of
* making compiler tests. Otherwise, all Unix systems endianness can be
* tested with the autoconf AC_C_BIGENDIAN test (defines WORDS_BIGENDIAN),
* otherwise it's generally safe to assume little-endianness due to the
* extreme number of Intel PCs and compilers out there. Big-endian non-unix
* exceptions would be Amiga or 68k Apple Macintosh (MPW compiler or
* CodeWarrior)
*/
#if !defined(XAD_BIGENDIAN) && !defined(XAD_LITTLEENDIAN)
# if defined(WORDS_BIGENDIAN) || defined(AMIGA) || defined(__SC__) || defined(__MWERKS__)
# define XAD_BIGENDIAN
# else
# define XAD_LITTLEENDIAN
# endif
#endif
#if defined(XAD_BIGENDIAN)
# define EndConvM32(a) (a)
# define EndConvM16(a) (a)
# define EndConvI32(a) _xecswap32(a)
# define EndConvI16(a) _xecswap16(a)
#elif defined(XAD_LITTLEENDIAN)
# define EndConvM32(a) _xecswap32(a)
# define EndConvM16(a) _xecswap16(a)
# define EndConvI32(a) (a)
# define EndConvI16(a) (a)
#else
# error Either XAD_BIGENDIAN or XAD_LITTLEENDIAN must be defined!
#endif
#endif /* XADMASTER_CONVERTE_C */